

#include "ObjetoDeformable.h"


ObjetoDeformable::ObjetoDeformable()
{

}

ObjetoDeformable::ObjetoDeformable(TipoGeometria enmTipo, char *FilenamePuntos, char *FilenameIndices)
{
    enmtipogeometria = enmTipo;
    FilenamePuntos = charFnameArchivoPtos;
    FilenameIndices = charFnameInds;
}


void ObjetoDeformable::CargarObjetoDeformable()
{
    cout << "Cargando Geometria Objeto Deformable..." << endl;

    if(enmtipogeometria==SUP_TRIANGULAR)
    {
        objSuperficieTriangular.set_FnamePtosSupTriang(charFnameArchivoPtos);
        objSuperficieTriangular.set_FnameIndsSupTriang(charFnameInds);
        objSuperficieTriangular.CargarSuperficieTriangular_2_0();
    }
    else if(enmtipogeometria==VOL_TETRAEDRAL)
    {

    }
}

void ObjetoDeformable::CrearModeloFisico()
{
    cout << "Cargando Modelo Fisico del ObjetoDeformable..." << endl;

    int intNumeroVertices;
    int intNumeroSprings;

    if(enmtipomodelo==MASS_SPRING_MODEL_CUASIESTATICO)
    {
        intNumeroVertices = objSuperficieTriangular.get_NroVertices();
        intNumeroSprings = objSuperficieTriangular.get_NroBordes();

        objMassSpringModel.setNroNodos(intNumeroVertices);
        objMassSpringModel.setNroSprings(intNumeroSprings);
        objMassSpringModel.InicializarModelo();

        //Asignando Nodos
        for(int i=0;i<=intNumeroVertices-1;i++)
        {
            //Asignando Vertices
            objMassSpringModel.getOneNodo(i).setVertice(objSuperficieTriangular.get_Vertice(i));
            objMassSpringModel.getOneNodo(i).setMasa(0.075);

			//Asignando VerticesVirtuales
			/*Vertice *objVertice = new Vertice(objSuperficieTriangular.get_Vertice(i)->getX(), 
				objSuperficieTriangular.get_Vertice(i)->getY(),objSuperficieTriangular.get_Vertice(i)->getZ());

			objVertice->setID(intNumeroVertices+i);
			
			objMassSpringModel.getOneNodo(i+intNumeroVertices).setVertice(objVertice);*/


            //Asginando estado incial nodo
            objMassSpringModel.getOneNodo(i).setEstadoNodo(NO_COLISION);

            //Asignando relacion otros nodos y springs
            //if(i!=4584)
            //if(i!=3060)
            //if(i!=4231)
			//if(i!=3641)
			//if(i!=2492)
            if(i!=1550)
			{
                objMassSpringModel.getOneNodo(i).setConexsNodo(objSuperficieTriangular.get_Vertice(i)->getConexionesVertice());
                objMassSpringModel.getOneNodo(i).setNroConexionesNodo(objSuperficieTriangular.get_Vertice(i)->getNroConexionesVertice()/*+1*/);
                objMassSpringModel.getOneNodo(i).setConexsSpring(objSuperficieTriangular.get_Vertice(i)->getConexionesBorde());
                objMassSpringModel.getOneNodo(i).setNroConexionesSpring(objSuperficieTriangular.get_Vertice(i)->getNroConexionesBorde()/*+1*/);

				/*objMassSpringModel.getOneNodo(i).setOneConNodo(i+intNumeroVertices);
				objMassSpringModel.getOneNodo(i).setOneConSpring(i+intNumeroSprings);

				//Configurando Nodos Virtuales
				objMassSpringModel.getOneNodo(i+intNumeroVertices).setOneConNodo(i);
				objMassSpringModel.getOneNodo(i+intNumeroVertices).setNroConexionesNodo(1);
				objMassSpringModel.getOneNodo(i+intNumeroVertices).setOneConSpring(i+intNumeroSprings);
				objMassSpringModel.getOneNodo(i+intNumeroVertices).setNroConexionesSpring(1);*/

				//Configurando Resortes Virtuales
				/*objMassSpringModel.getOneSpring(intNumeroSprings+i).setNodo1(objMassSpringModel.getOneNodo(i));
				objMassSpringModel.getOneSpring(intNumeroSprings+i).setNodo2(objMassSpringModel.getOneNodo(i+intNumeroVertices));
				objMassSpringModel.getOneSpring(intNumeroSprings+i).setIndice1(i);
				objMassSpringModel.getOneSpring(intNumeroSprings+i).setIndice2(i+intNumeroVertices);
				objMassSpringModel.getOneSpring(intNumeroSprings+i).setConstStiffness(0.00002);
				objMassSpringModel.getOneSpring(intNumeroSprings+i).CalcularRestLong();*/
            }
        }

        objMassSpringModel.getOneNodo(0).setEstadoNodo(CONDICION_FRONTERA);
        objMassSpringModel.getOneNodo(50).setEstadoNodo(COLISION);

        int intIndiceTemp1;
        int intIndiceTemp2;

		//Resortes derivados de la geometria
		for(int i=0;i<=intNumeroSprings;i++)
        {
            intIndiceTemp1 = objSuperficieTriangular.getOneBorde(i).getIndice1();
            intIndiceTemp2 = objSuperficieTriangular.getOneBorde(i).getIndice2();

            //Asignando Resortes
            objMassSpringModel.getOneSpring(i).setNodo1(objMassSpringModel.getOneNodo(intIndiceTemp1));
            objMassSpringModel.getOneSpring(i).setNodo2(objMassSpringModel.getOneNodo(intIndiceTemp2));
            objMassSpringModel.getOneSpring(i).setIndice1(intIndiceTemp1);
            objMassSpringModel.getOneSpring(i).setIndice2(intIndiceTemp2);
            objMassSpringModel.getOneSpring(i).setConstStiffness(0.002);
            objMassSpringModel.getOneSpring(i).CalcularRestLong();
        }
    }
    else if(enmtipomodelo==MASS_SPRING_MODEL_DINAMICO)
    {
	
    }
    else if(enmtipomodelo==FINITE_ELEMENT_MODEL)
    {
		
    }
    else
    {
		//throw new exception;
    }

}


void ObjetoDeformable::CargarJerarquia(){
    cout << "Cargando Jerarquia..." << endl;

    objArbolRitter.Inicializar(objSuperficieTriangular.get_Triangulos());
}


